"""
RagFlow 客户端 GUI 基础功能模块
所有功能模块都应该继承这个基类
"""

from PySide6.QtCore import QObject, Signal
from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QLabel, QPushButton, QMessageBox
from ragflow_client.config import RagFlowConfig
from ragflow_client.service import RagFlowService


class BaseFeature(QObject):
    """基础功能类"""
    
    # 定义信号
    log_message = Signal(str)  # 日志消息信号
    
    def __init__(self, parent=None):
        """初始化基础功能"""
        super().__init__(parent)
        self.parent = parent
        self.window = None
    
    def get_config(self) -> RagFlowConfig:
        """
        获取当前配置
        
        Returns:
            当前配置对象
        """
        # 尝试从父对象获取配置
        if hasattr(self.parent, "get_config"):
            return self.parent.get_config()
        elif hasattr(self.parent, "config"):
            return self.parent.config
        
        # 如果无法获取配置，返回None
        return None
    
    def get_api_info(self) -> tuple:
        """
        获取API信息
        
        Returns:
            (api_url, api_key, kb_id, debug) 元组
        """
        if not hasattr(self.parent, "api_url_edit") or \
           not hasattr(self.parent, "api_key_edit") or \
           not hasattr(self.parent, "kb_id_edit") or \
           not hasattr(self.parent, "debug_checkbox"):
            return None, None, None, False
        
        api_url = self.parent.api_url_edit.text().strip()
        api_key = self.parent.api_key_edit.text().strip()
        kb_id = self.parent.kb_id_edit.text().strip()
        debug = self.parent.debug_checkbox.isChecked()
        
        return api_url, api_key, kb_id, debug
    
    def create_temp_config(self, parser_id="naive", doc_dir="", doc_suffix=None) -> RagFlowConfig:
        """
        创建临时配置对象
        
        Args:
            parser_id: 解析器ID
            doc_dir: 文档目录
            doc_suffix: 文档后缀列表
            
        Returns:
            临时配置对象
        """
        api_url, api_key, kb_id, debug = self.get_api_info()
        
        if doc_suffix is None:
            doc_suffix = []
            
        return RagFlowConfig(
            api_url=api_url,
            api_key=api_key,
            kb_id=kb_id,
            kb_name="",
            parser_id=parser_id,
            doc_dir=doc_dir,
            doc_suffix=doc_suffix,
            debug=debug
        )
    
    def create_service(self, config=None) -> RagFlowService:
        """
        创建服务对象
        
        Args:
            config: 配置对象，如果为None则使用临时配置
            
        Returns:
            服务对象
        """
        if config is None:
            config = self.create_temp_config()
            
        return RagFlowService(config)
    
    def validate_api_config(self, check_kb_id=True) -> bool:
        """
        验证API配置
        
        Args:
            check_kb_id: 是否检查知识库ID
            
        Returns:
            验证是否通过
        """
        api_url, api_key, kb_id, _ = self.get_api_info()
        
        if not api_url:
            QMessageBox.critical(self.parent, "错误", "API 地址不能为空")
            return False
        
        if not api_key:
            QMessageBox.critical(self.parent, "错误", "API 密钥不能为空")
            return False
        
        if check_kb_id and not kb_id:
            QMessageBox.critical(self.parent, "错误", "知识库 ID 不能为空")
            return False
            
        return True
    
    def check_api_config(self) -> bool:
        """
        检查API配置是否已设置，如果未设置则提示用户并打开配置页面
        
        Returns:
            如果配置有效返回True，否则返回False
        """
        # 获取配置
        config = None
        
        # 尝试从父对象获取配置
        if hasattr(self.parent, "get_config"):
            config = self.parent.get_config()
        elif hasattr(self.parent, "config"):
            config = self.parent.config
        else:
            # 如果无法从父对象获取配置，尝试创建临时配置
            config = self.create_temp_config()
        
        # 检查API URL
        if not config or not config.api_url:
            QMessageBox.critical(self.parent, "错误", "请先在配置页面设置API地址")
            
            # 打开配置页面
            from ragflow_client.gui.features.config_feature import ConfigFeature
            config_feature = ConfigFeature(self.parent)
            config_feature.execute()
            return False
        
        # 检查API Key
        if not config.api_key:
            QMessageBox.critical(self.parent, "错误", "请先在配置页面设置API密钥")
            
            # 打开配置页面
            from ragflow_client.gui.features.config_feature import ConfigFeature
            config_feature = ConfigFeature(self.parent)
            config_feature.execute()
            return False
        
        return True
    
    def create_window(self, title, content_widget=None):
        """
        创建一个新窗口
        
        Args:
            title: 窗口标题
            content_widget: 窗口内容部件
        
        Returns:
            创建的窗口
        """
        # 创建窗口
        window = QMainWindow(self.parent)
        window.setWindowTitle(title)
        window.setMinimumSize(800, 600)
        
        # 如果提供了内容部件，设置为中央部件
        if content_widget:
            window.setCentralWidget(content_widget)
        
        return window
    
    def execute(self):
        """
        执行功能
        子类应该重写这个方法
        """
        raise NotImplementedError("子类必须实现execute方法")
